home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / KEYBOARD.PAS < prev    next >
Pascal/Delphi Source File  |  1997-03-02  |  6KB  |  217 lines

  1. UNIT Keyboard;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ KeyPressed and ReadKey routines               Last changed: 02.03.97  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-97 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. USES Use32, OpKey;
  16.  
  17. CONST
  18.   HelpKey    : Word = F1;
  19.   InMainMenu : Boolean = False;
  20.  
  21. TYPE
  22.   KbdStatType = PROCEDURE(KbdFlag: Byte);
  23.  
  24. PROCEDURE SetKbdStatProc(p: KbdStatType) ;
  25. PROCEDURE NoKbdStatProc(KbdFlag: Byte) ;
  26. FUNCTION  PopKeyPressed: Boolean;
  27. FUNCTION  PopReadKeyWord: Word;
  28. PROCEDURE StartClock;
  29. PROCEDURE StopClock;
  30.  
  31. IMPLEMENTATION
  32.  
  33. USES Dos, OpDos, OpCrt, OpDate, OpWindow, OpString, OpCal, OpCalc, OpQkRef,
  34.      ApTimer,
  35.      MTask, ScrBlank, DosShell, LogFile, MemStat, InterCom, PoPTypes,
  36.      Globals, Util,
  37. {$IFNDEF OS2}
  38.      Macro,
  39. {$ELSE}
  40.      VpUtils,
  41. {$ENDIF}
  42.      PoPHelp;
  43.  
  44. VAR
  45.   NewKbdFlags,
  46.   OldKbdFlags : Byte;
  47.   KbdStatProc : KbdStatType;
  48.   Clock       : LongInt;
  49.  
  50.   PROCEDURE SetKbdStatProc(p: KbdStatType) ;
  51.   BEGIN
  52.     KbdStatProc:=p;
  53.     NewKbdFlags:=0;
  54.     OldKbdFlags:=1;
  55.   END;
  56.  
  57.   PROCEDURE NoKbdStatProc(KbdFlag: Byte) ;
  58.   BEGIN
  59.   END;
  60.  
  61.   FUNCTION PopKeyPressed: Boolean;
  62.   BEGIN
  63.     IF KbdFlags<>BlankKbdFlags THEN TurnScreen(On);
  64.     NewKbdFlags:=KbdFlags AND $0f;
  65.     IF NewKbdFlags<>OldKbdFlags THEN
  66.     BEGIN
  67.       KbdStatProc(NewKbdFlags);
  68.       OldKbdFlags:=NewKbdFlags;
  69.     END;
  70.     IF KeyPressed THEN
  71.     BEGIN
  72.       KbdStatProc(0);
  73.       PopKeyPressed:=True;
  74.     END ELSE
  75.     BEGIN
  76. {     Inline($cd/$28); = int $28 }
  77.       WITH StatusWindow^, Cfg.Color[1] DO
  78.       BEGIN
  79. {$IFDEF OS2}
  80.         IF (Clock<>-1) AND (((GetTimemSec-Clock)>=1000) OR (GetTimemSec<Clock)) THEN
  81. {$ELSE}
  82.         IF (Clock<>-1) AND (((BiosTics^-Clock)>=18) OR (BiosTics^<Clock)) THEN
  83. {$ENDIF}
  84.         BEGIN
  85.           IF ScreenBlanked THEN
  86.             MoveClock
  87.           ELSE
  88.           BEGIN
  89.             ActivateWrite;
  90.             wFastWrite(TodayString('dd/mm-yy'),1,11,HighLightColor);
  91.             wFastWrite(CurrentTimeString('hh:mm:ss'),2,11,HighlightColor);
  92.             DeActivateWrite;
  93.           END;
  94.           StartClock;
  95.         END;
  96.       END;
  97.       GiveUpTime;
  98.       PopKeyPressed:=KeyPressed;
  99.     END;
  100.   END;
  101.  
  102.   FUNCTION PopReadKeyWord: Word;
  103.   VAR
  104.     w : Word;
  105.     i : LongInt;
  106.     OldPrompt      : String;
  107.     Env            : EnvRec;
  108.     TmpAdr         : TFidoAddress;
  109.     Cal            : CalendarPtr;
  110.     Calc           : CalculatorPtr;
  111.     QkRef          : QkRefChartPtr;
  112.   BEGIN
  113.     w:=0;
  114.     REPEAT
  115.       REPEAT
  116.         GiveUpTime;
  117.       UNTIL PopKeyPressed;
  118.       TurnScreen(On);
  119.       w:=ReadKeyWord;
  120.       IF KeyboardLock THEN
  121.       BEGIN
  122.         IF Chr(Lo(w)) = data.KbdPassword[Length(TmpPassword) + 1] THEN TmpPassword:=TmpPassword + Chr(Lo(w)) ELSE
  123.           TmpPassword:='';
  124.         IF TmpPassword = data.KbdPassword THEN
  125.         BEGIN
  126.           data.KbdPassword:='';
  127.           KeyboardLock:=False;
  128.           AddLog(' ', 'Keyboard unlocked');
  129. {$IFNDEF OS2}
  130.           WriteMacroStatus;
  131. {$ENDIF}
  132.         END;
  133.         w:=1;
  134.       END ELSE
  135.       BEGIN
  136.         CASE w OF
  137.           $e00d: w:=Enter;
  138.           AltG : MemoryStatus;
  139.           AltJ : BEGIN
  140.                    FillChar(TmpAdr, SizeOf(TmpAdr), 0);
  141.                    IF SetInterCom(ICDosShell,TmpAdr,False) THEN
  142.                    BEGIN
  143.                      AddLog(':', 'Shelling to OS');
  144.                      CurrentEnv(Env);
  145.                      OldPrompt:=GetEnvStr(Env, 'PROMPT=');
  146.                      SetEnvStr(Env, 'PROMPT=', '[Portal of Power v' + Ver + ' Shell]$_' + OldPrompt);
  147.                      i:=ShellToDos(GetEnv('COMSPEC'), '',True);
  148.                      SetEnvStr(Env, 'PROMPT=', OldPrompt);
  149.                      IF i=0 THEN
  150.                        AddLog(':', 'Portal of Power Reactivated')
  151.                      ELSE
  152.                        AddLog('!', 'Error '+Long2Str(i)+' when shelling to OS');
  153.                    END;
  154.                  END;
  155. {$IFNDEF OS2}
  156.           AltK : IF NOT InMainMenu THEN
  157.                  BEGIN
  158.                    i:=0;
  159.                    MacroMenu(i);
  160.                  END;
  161. {$ENDIF}
  162. {$IFNDEF PoPLite}
  163.           Alt1 : BEGIN
  164.                    New(Cal, InitCustom(25+((ScreenWidth-80) DIV 2), 10, DefLeftTee, DefCrossBar, DefRightTee,
  165.                                        Cfg.Color[4], DefWindowOptions));
  166.                    IF  Cal<>Nil THEN
  167.                    BEGIN
  168.                      Cal^.ProcessSelf;
  169.                      Dispose(Cal, Done);
  170.                    END;
  171.                  END;
  172.           Alt2 : BEGIN
  173.                    New(Calc, InitCustom(20+((ScreenWidth-80) DIV 2), 10, DefLeftTee, DefCrossBar, DefRightTee,
  174.                                         Cfg.Color[4], DefWindowOptions));
  175.                    IF  Calc<>Nil THEN
  176.                    BEGIN
  177.                      Calc^.ProcessSelf;
  178.                      Dispose(Calc, Done);
  179.                    END;
  180.                  END;
  181.           Alt3 : BEGIN
  182.                    New(QkRef, InitCustom(2, 3, ScreenWidth-1, ScreenHeight-1, DefLeftTee,
  183.                                          DefCrossBar, DefRightTee, Cfg.Color[4], DefWindowOptions));
  184.                    IF  QkRef<>Nil THEN
  185.                    BEGIN
  186.                      QkRef^.ProcessSelf;
  187.                      Dispose(QkRef, Done);
  188.                    END;
  189.                  END;
  190. {$ENDIF}
  191.           ELSE   IF (w=HelpKey) AND (Topic<>0) THEN HelpRoutine(0, Nil, Topic);
  192.         END;
  193.       END;
  194.     UNTIL w<>0;
  195.     NewTimerSecs(ScreenBlank, Cfg.Screen.BlankTime);
  196.     PopReadKeyWord:=w;
  197.   END;
  198.  
  199.   PROCEDURE StartClock;
  200.   BEGIN
  201. {$IFDEF OS2}
  202.     Clock:=GetTimemSec;
  203. {$ELSE}
  204.     Clock:=BiosTics^;
  205. {$ENDIF}
  206.   END;
  207.  
  208.   PROCEDURE StopClock;
  209.   BEGIN
  210.     Clock:=-1;
  211.   END;
  212.  
  213. BEGIN
  214.   OldKbdFlags:=0;
  215.   KbdStatProc:=NoKbdStatProc;
  216. END.
  217.